package org.example.pool;

import java.util.concurrent.*;

/**
 * ThreadPoolExecutor() 手动创建线程池
 *
 * -- 四大拒绝策略
 * new ThreadPoolExecutor.AbortPolicy()         银行满了，还有人进来，不处理，抛异常
 * new ThreadPoolExecutor.CallerRunsPolicy()    银行满了，还有人进来，谁带来的谁处理
 * new ThreadPoolExecutor.DiscardPolicy()       银行满了，还有人进来，不处理，不抛异常
 * new ThreadPoolExecutor.DiscardOldestPolicy()    银行满了，还有人进来，尝试和最早的插队，不抛出异常(会阻塞)
 */
public class ThreadPoolExecutorDemo {

    public static void main(String[] args) {
        // -- 七大参数
        // ThreadPoolExecutor(int corePoolSize,                     核心线程数（最小线程数）
        //                    int maximumPoolSize,                  最大线程数（超过此值，线程交给 handler 丢弃处理）
        //                    long keepAliveTime,                   空闲线程存活时间
        //                    TimeUnit unit,                        时间单位
        //                    BlockingQueue<Runnable> workQueue,    阻塞队列
        //                    ThreadFactory threadFactory,          线程工厂(接口)
        //                    RejectedExecutionHandler handler)     拒绝策略（默认：AbortPolicy()）
        ExecutorService threadPool =
                new ThreadPoolExecutor(2,       // 银行最少开放两个柜台
                        5,                  // 总共五个柜台
                        0L,                    // 空闲就关闭
                        TimeUnit.MILLISECONDS,
                        new LinkedBlockingQueue<>(3),// 三个等待座位
                        Executors.defaultThreadFactory(),
                        new ThreadPoolExecutor.AbortPolicy());    // 容不下就抛出异常

        try {
            // 最大同时存在的线程容量：maxSize + queueSize
            for (int i = 1; i <= 8; i++) {
                threadPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName());
                });
            }
        } finally {
            // 程序结束，关闭线程池
            threadPool.shutdown();
        }
    }
}
